<?php
namespace app\lawcase\model;

use think\Model;
use think\facade\Db;

class Court extends Model
{
    protected $name = 'court';
    protected $prefix = 'oa_';
    protected $pk = 'id';
    protected $autoWriteTimestamp = true;

    /**
     * 获取法院列表
     * @param array $where 查询条件
     * @param array $param 分页参数
     * @return array
     */
    public function getList($where = [], $param = [])
    {
        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
        $order = empty($param['order']) ? 'name asc, id desc' : $param['order'];
        try {
            $list = $this->where($where)
                ->where('delete_time', 0)
                ->order($order)
                ->paginate(['list_rows' => $rows, 'query' => $param])
                ->each(function ($item) {
                    $item->level_text = $this->getLevelText($item->level);
                    $item->full_address = $this->getFullAddress($item);
                    $item->case_count = Db::name('lawcase')
                        ->where(['court_id' => $item->id, 'delete_time' => 0])
                        ->count();
                    return $item;
                });

            if (empty($list)) {
                return ['code' => 0, 'msg' => '暂无数据', 'count' => 0, 'data' => []];
            }
            
            return ['code' => 0, 'msg' => '', 'count' => $list->total(), 'data' => $list->items()];
        } catch (\Exception $e) {
            return ['code' => 1, 'msg' => $e->getMessage(), 'count' => 0, 'data' => []];
        }
    }

    /**
     * 添加法院
     * @param array $data 法院数据
     * @return array
     */
    public function add($data)
    {
        try {
            $data['create_time'] = time();
            $data['update_time'] = time();
            $insertId = $this->strict(false)->insertGetId($data);
            
            if ($insertId) {
                add_log('add', $insertId, $data);
                return ['code' => 0, 'msg' => '添加成功', 'data' => ['id' => $insertId]];
            }
            return ['code' => 1, 'msg' => '添加失败'];
        } catch (\Exception $e) {
            return ['code' => 1, 'msg' => '操作失败：' . $e->getMessage()];
        }
    }

    /**
     * 编辑法院
     * @param array $data 法院数据
     * @return array
     */
    public function edit($data)
    {
        try {
            $data['update_time'] = time();
            $this->strict(false)->where('id', $data['id'])->update($data);
            add_log('edit', $data['id'], $data); // 记录日志
        } catch (\Exception $e) {
            return to_assign(1, '操作失败：' . $e->getMessage());
        }
        return to_assign(0,'操作成功',['return_id'=>$data['id']]);
    }

    /**
     * 删除法院信息（支持逻辑删除和物理删除）
     * @param int $id 法院ID
     * @param bool $force 是否强制物理删除，默认false（逻辑删除）
     * @return array 返回操作结果，包含状态码和提示信息
     */
    public function remove($id, $force = true)
    {
        // 确保id参数是整数
        $id = (int)$id;
        if ($id <= 0) {
            return to_assign(1, '参数错误');
        }
        $info = $this->find($id);
        if (empty($info)) {
            return to_assign(1, '法院不存在');
        }

        // 检查是否被案件引用
        $hasCases = Db::name('lawcase')
            ->where('court_id', $id)
            ->where('delete_time', 0)
            ->count();

        if ($hasCases > 0) {
            return to_assign(1, '法院已被案件引用，无法删除');
        }

        if ($force) {
            // 逻辑删除
            try {
                $param['delete_time'] = time();
                self::where('id', $id)->update(['delete_time' => time()]);
                add_log('delete', $id);
            } catch (\Exception $e) {
                return to_assign(1, '操作失败，原因2：' . $e->getMessage());
            }
            return to_assign(0, '删除成功');
        } else {
            // 物理删除
            try {
                $result = self::destroy($id);
                if ($result) {
                    add_log('delete', $id);
                    return to_assign(0, '删除成功');
                } else {
                    return to_assign(1, '物理删除失败');
                }
            } catch (\Exception $e) {
                return to_assign(1, '操作失败，原因3：' . $e->getMessage());
            }
        }
    }

    /**
     * 获取法院级别文本
     * @param int $level 法院级别
     * @return string
     */
    protected function getLevelText($level)
    {
        $levels = [
            1 => '最高人民法院',
            2 => '高级人民法院',
            3 => '中级人民法院',
            4 => '基层人民法院',
            5 => '法庭',
            6 => '执行局',
            7 => '其他'
        ];
        return $levels[$level] ?? '未知级别';
    }

    /**
     * 获取法院完整地址
     * @param object $item 法院对象
     * @return string
     */
    protected function getFullAddress($item)
    {
        $address = '';
        if ($item->provinceid) {
            $address .= Db::name('region')->where('id', $item->provinceid)->value('name') . ' ';
        }
        if ($item->cityid) {
            $address .= Db::name('region')->where('id', $item->cityid)->value('name') . ' ';
        }
        if ($item->distid) {
            $address .= Db::name('region')->where('id', $item->distid)->value('name') . ' ';
        }
        $address .= $item->address;
        return $address;
    }

    /**
     * 根据ID获取法院详情
     * @param int $id 法院ID
     * @return array|object|null
     */
    public function getById($id)
    {
        return $this->where('id', (int)$id)->where('delete_time', 0)->find();
    }
}